home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / MEMORY.SWG / 0024_EMS Addressing.pas < prev    next >
Pascal/Delphi Source File  |  1993-08-27  |  3KB  |  121 lines

  1. {
  2. HENRIK SCHMIDT-MOELLER
  3.  
  4. I've made some procedures for EMS addressing in TP. EMS uses a technic called
  5. bank switching. It reserves a 64k area (EmmSeg) in memory for EMS and maps/
  6. unmaps 16k EMS-pages in this area. Look at interrupt 67h for a complete list of
  7. EMS commands. I haven't had time to comment on these procedures, so if you
  8. don't understand them, feel free to ask. OK, here goes nothing...
  9.  
  10. Oh, by the way, REMEMBER to DEallocate!!!
  11. }
  12.  
  13. VAR
  14.   EmmSeg,
  15.   EmmHandle : Word;
  16.   Err       : Byte;
  17.  
  18. PROCEDURE DeallocateMem(Handle : Word); Forward;
  19.  
  20. PROCEDURE Error(E : String);
  21. BEGIN
  22.   DeallocateMem(Emmhandle);
  23.   WriteLn(#7 + E);
  24.   Halt(1);
  25. END;
  26.  
  27. PROCEDURE AllocateMem(LogPages : Word);
  28. BEGIN
  29.   ASM
  30.     MOV  AH, 43h
  31.     MOV  BX, LogPages
  32.     INT  67h
  33.     MOV  Err, AH
  34.     MOV  EmmHandle, DX
  35.   END;
  36.   CASE Err OF
  37.     $80 : Error('AllocateMem: Internal error in EMS software');
  38.     $81 : Error('AllocateMem: Malfunction in EMS software');
  39.     $84 : Error('AllocateMem: Undefined function');
  40.     $85 : Error('AllocateMem: No more handles available');
  41.     $87 : Error('AllocateMem: Allocation requested more pages than are' + #13#10 +
  42.                 '             physically available; no pages allocated');
  43.     $88 : Error('AllocateMem: Specified more logical pages than are'+ #13#10 +
  44.                 ' currently available; no pages allocated');
  45.     $89 : Error('AllocateMem: Zero pages requested');
  46.   END;
  47. END;
  48.  
  49. PROCEDURE MapEmm(PsyPage : Byte; LogPage : Word);
  50. BEGIN
  51.   ASM
  52.     MOV  AH, 44h
  53.     MOV  AL, PsyPage
  54.     MOV  BX, LogPage
  55.     MOV  DX, EmmHandle
  56.     INT  67h
  57.     MOV  Err, AH;
  58.   END;
  59.   CASE Err OF
  60.     $80 : Error('MapEmm: Internal error in EMS software');
  61.     $81 : Error('MapEmm: Malfunction in EMS software');
  62.     $83 : Error('MapEmm: Invalid handle');
  63.     $84 : Error('MapEmm: Undefined function');
  64.     $8A : Error('MapEmm: Logical page not assigned to this handle');
  65.     $8B : Error('MapEmm: Physical page number invalid');
  66.   END;
  67. END;
  68.  
  69. PROCEDURE DeallocateMem(Handle : Word);
  70. BEGIN
  71.   ASM
  72.     MOV  AH, 45h
  73.     MOV  DX, Handle
  74.     INT  67h
  75.   END;
  76. END;
  77.  
  78. PROCEDURE GetPageSeg;
  79. BEGIN
  80.   ASM
  81.     MOV  AH, 41h
  82.     INT  67h
  83.     MOV  EmmSeg, BX
  84.     MOV  Err, AH;
  85.   END;
  86.   CASE Err OF
  87.     $80 : Error('GetPageSeg: Internal error in EMS software');
  88.     $81 : Error('GetPageSeg: Malfunction in EMS software');
  89.     $84 : Error('GetPageSeg: Undefined function');
  90.   END;
  91. END;
  92.  
  93. PROCEDURE GetMaxPages(VAR Num : Word);
  94. VAR
  95.   Dummy : Word;
  96. BEGIN
  97.   ASM
  98.     MOV  AH, 42h
  99.     INT  67h
  100.     MOV  Dummy, BX
  101.     MOV  Err, AH;
  102.   END;
  103.   Num := Dummy;
  104.   CASE Err OF
  105.     $80 : Error('GetMaxPages: Internal error in EMS software');
  106.     $81 : Error('GetMaxPages: Malfunction in EMS software');
  107.     $84 : Error('GetMaxPages: Undefined function');
  108.   END;
  109. END;
  110.  
  111. PROCEDURE WriteMem(Page : Byte; Pos : Integer; Ch : Char);
  112. BEGIN
  113.   Mem[EmmSeg : Page * $4000 + Pos] := Ord(Ch);
  114. END;
  115.  
  116. PROCEDURE ReadMem(Page : Byte; Pos : Integer; VAR Ch : Char);
  117. BEGIN
  118.   Ch := Chr(Mem[EmmSeg : Page * $4000 + Pos]);
  119. END;
  120.  
  121.